home *** CD-ROM | disk | FTP | other *** search
/ PC Graphics Unleashed / PC Graphics Unleashed.iso / ch01 / cirrus54.asm < prev    next >
Assembly Source File  |  1993-11-21  |  16KB  |  432 lines

  1. ;--------------------------------------------------------------------------
  2. ; This is file CIRRUS.ASM
  3. ;
  4. ; Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
  5. ; Copyright (C) 1992 Csaba Biegl, 820 Stirrup Dr, Nashville, TN 37221
  6. ; Copyright (C) 1993 Hartmut Schirmer, Feldstr. 118, 2300 Kiel 1, Germany
  7. ; Copyright (C) 1993 Ben Jos Walbeehm, Lijsterbeslaan 20, 5248 BB Rosmalen,
  8. ;                                                                 Netherlands
  9. ;
  10. ; This file is distributed under the terms listed in the document
  11. ; "copying.dj", available from DJ Delorie at the address above.
  12. ; A copy of "copying.dj" should accompany this file; if not, a copy
  13. ; should be available from where this file was obtained.  This file
  14. ; may not be distributed without a verbatim copy of "copying.dj".
  15. ;
  16. ; This file is distributed WITHOUT ANY WARRANTY; without even the implied
  17. ; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  18. ;--------------------------------------------------------------------------
  19. ; 64K mode added by J.Dittrich dittrich@ifk20.mach.uni-karlsruhe.de
  20. ; 16M mode doesn't work!     ***!!!***  But it does!  See below (BJW).
  21. ;--------------------------------------------------------------------------
  22. ; A number of modes (the 2Mb-video-RAM modes amongst others) added by 
  23. ; B.J. Walbeehm (Walbeehm@fsw.ruu.nl).
  24. ;
  25. ; NOTE:  The 16M mode can be made to work properly when using DISP V1.57
  26. ; =====  or better! To accomplish this, put the following two lines in the
  27. ;        "Bytes per line scan table for TrueColour Mode" (see CONFIG.DIS):
  28. ;            bytes_per_line_true=0,2048
  29. ;            bytes_per_line_true=3,2048
  30. ;--------------------------------------------------------------------------
  31. ;
  32. ; This driver supports Cirrus CL-GD542X Chipsets
  33. ; Check your BIOS documentation if all of below modes are supported !
  34. ;
  35. include grdriver.inc
  36. cseg    segment byte public 'code'
  37.     assume  cs:cseg, ds:cseg, es:cseg, ss:nothing
  38.  
  39.  
  40. ;--------------------------------------------------------------------------
  41. ; DRIVER HEADER
  42. ;  The following entries MUST match the structure and constant
  43. ;  declarations in the file 'grdriver.h' of the GRX graphics library
  44. ;  The mode word should contain the following bitfields:
  45. ;     - the GRD_NEW_DRIVER bit set for any new format driver
  46. ;     - the adapter type field should be specified
  47. ;     - the memory size field should be specified
  48. ;     - the paging mode field should be specified
  49. ;  The mode set routine will OR in the plane bitfield as it will
  50. ;  change when different color number modes are requested.
  51. ;--------------------------------------------------------------------------
  52.  
  53.     dw      offset mode_set_routine
  54.     dw      offset paging_routine
  55. mode_W  dw      GRD_NEW_DRIVER+GRD_VGA+GRD_1024K+GRD_NO_RW
  56. ;
  57. ; The 'def_xx' fields are filled in by go32 from the corresponding
  58. ; fields of the 'GO32' environment variable
  59. ;
  60. def_tw  dw      80              ; text width
  61. def_th  dw      25              ; text height
  62. def_gw  dw      640             ; graphics width
  63. def_gh  dw      480             ; graphics height
  64. def_nc  dw      16              ; graphics colors
  65.     dw      offset driver_init_routine
  66.     dw      offset text_mode_table
  67.     dw      offset graphics_mode_table
  68.  
  69. ;
  70. ; Biggest text and graphics sizes
  71. ;
  72. Max_TW  equ     132
  73. Max_TH  equ     50
  74. Max_GWn equ     800             ; non interlaced!!!
  75. Max_GHn equ     600
  76. Max_GW  equ     1280            ; may be interlaced
  77. Max_GH  equ     1024
  78.  
  79.  
  80. ;--------------------------------------------------------------------------
  81. ; TABLE OF SUPPORTED TEXT MODES
  82. ;       - keep sorted by size
  83. ;       - end with an all 0 entry
  84. ;       - BIOS field = 0xff disables it
  85. ;       - fields:
  86. ;               width,  height, colors, BIOS#+  setup_procedure_index*256
  87. ;--------------------------------------------------------------------------
  88. text_mode_table         label word
  89.     dw      80,     25,      2,     007h +  00000h
  90.     dw      40,     25,     16,     001h +  00000h ; also: mode 000h
  91.     dw      40,     50,     16,     001h +  00100h ; also: mode 000h *
  92.     dw      80,     25,     16,     003h +  00000h ; also: mode 002h
  93.     dw      80,     50,     16,     003h +  00100h ; also: mode 002h *
  94.     dw     132,     25,     16,     014h +  00000h ; also: mode 055h
  95.     dw     132,     43,     16,     054h +  00000h
  96.     dw     132,     50,     16,     014h +  00100h ; also: mode 055h *
  97.     dw       0,      0,      0,     000h +  00000h
  98.  
  99.  
  100. ;--------------------------------------------------------------------------
  101. ; TABLE OF SUPPORTED GRAPHICS MODES
  102. ;       - keep sorted first by colors then by size
  103. ;       - end with an all 0 entry
  104. ;       - BIOS field = 0xff disables it
  105. ;       - fields:
  106. ;               width,  height, colors, BIOS#+  setup_procedure_index*256
  107. ;--------------------------------------------------------------------------
  108. graphics_mode_table     label word
  109.     dw      640,    200,      2,    006h +  00000h
  110.     dw      640,    350,      2,    00fh +  00000h
  111.     dw      640,    480,      2,    011h +  00000h
  112.  
  113.     dw      320,    200,      4,    005h +  00000h
  114.  
  115.     dw      320,    200,     16,    00dh +  00000h
  116.     dw      640,    200,     16,    00eh +  00000h
  117.     dw      640,    350,     16,    010h +  00000h
  118.     dw      640,    480,     16,    012h +  00000h
  119.     dw      800,    600,     16,    058h +  00000h ; also: mode 06ah
  120.     dw     1024,    768,     16,    05dh +  00000h
  121.     dw     1280,   1024,     16,    06ch +  00000h
  122.  
  123.     dw      320,    200,    256,    013h +  00000h
  124.     dw      640,    480,    256,    05fh +  00000h
  125.     dw      800,    600,    256,    05ch +  00000h
  126.     dw     1024,    768,    256,    060h +  00000h
  127. TwoMegMode1             label word
  128.     dw     1280,   1024,    256,    06dh +  00000h ; requires 2 Mb !!!
  129.  
  130.     dw      640,    480,  32768,    066h +  00000h
  131.     dw      800,    600,  32768,    067h +  00000h
  132.  
  133.     dw    320,    200, 0c010h,    06fh +    00000h
  134.     dw    640,    480, 0c010h,    064h +  00000h 
  135.     dw    800,    600, 0c010h,    065h +  00000h
  136. TwoMegMode2             label word
  137.     dw     1024,    768, 0c010h,    074h +  00000h ; requires 2 Mb !!!
  138. ; To use the 16M modes, see note above (BJW)
  139.     dw    320,    200, 0c018h,    070h +    00000h
  140.     dw      640,    480, 0c018h,    071h +  00000h
  141.     dw        0,      0,      0,    000h +  00000h
  142.  
  143.  
  144. ;--------------------------------------------------------------------------
  145. ; TABLE OF SPECIAL SETUP PROCEDURES
  146. ;  You may need such procedures for:
  147. ;     -- reloading fonts on standard EGA or VGA for
  148. ;        higher resolution text modes
  149. ;     -- enable HiColor mode of some Super VGAs
  150. ;     -- Handle the parameter passing conventions of the VESA BIOS
  151. ;     -- put VGA into 256 color plane mode ("MODE X")
  152. ;     -- etc...
  153. ;  There should be one entry in the table for every non-zero
  154. ;  'setup_procedure_index' in the text and graphics mode tables.
  155. ;  The first entry in the table belongs to index 100h, and so on.
  156. ;  The special setup procedure is invoked via a near call.
  157. ;
  158. ;  Entry: DI=address of the mode record from the text or graphics
  159. ;         table to set up.
  160. ;
  161. ;  Exit:  Adapter configured
  162. ;         BX=driver mode word as it should be returned by the mode set
  163. ;            routine. Typically it involves picking up the mode word
  164. ;            from the header and OR-ing in the appropriate bitplane mode
  165. ;            bitfield. (This is not needed for text modes)
  166. ;         AX, CX, DX, SI can be trashed, PRESERVE DI!!!!
  167. ;
  168. ;  NOTE: This runs in real mode, but don't mess with the segment registers.
  169. ;--------------------------------------------------------------------------
  170. special_setup_table     label word
  171.     dw      offset  VGA_50row_mode_set
  172.  
  173. ;
  174. ; Routine to set up VGA 50 row mode
  175. ; interface is described above
  176. ;
  177. VGA_50row_mode_set      proc    near
  178.     mov     al,[di+6]               ; set 40x25 or 80x25 or 132x25 mode
  179.     xor     ah,ah
  180.     int     10h
  181.     xor     bx,bx
  182.     mov     ax,1112h                ; load 8x8 font
  183.     int     10h
  184.     ret
  185. VGA_50row_mode_set      endp
  186.  
  187.  
  188. ;--------------------------------------------------------------------------
  189. ; DRIVER INIT ROUTINE
  190. ;  called once after the driver is loaded
  191. ;  may do one or more of the followings:
  192. ;    - check for proper board type
  193. ;    - check amount of RAM on board, and:
  194. ;       -- update word in header to reflect correct amount
  195. ;       -- disable modes in the tables for which there is not enough RAM
  196. ;    - check for special equipment (HiColor DAC, etc...)
  197. ;
  198. ;  Entry: nothing
  199. ;
  200. ;  Exit:  AX=status:
  201. ;          non-zero: OK,
  202. ;          0: something went wrong (e.g. wrong adapter, etc..)
  203. ;         BX,CX,DX may be trashed
  204. ;
  205. ;  NOTE: This runs in real mode, but don't mess with the segment registers.
  206. ;--------------------------------------------------------------------------
  207. driver_init_routine     proc    far
  208.         mov     ah,12h
  209.         mov     bl,85h
  210.         int     10h                     ; get number of 64k banks
  211.         cmp     al,24                   ; at least 24 banks required for
  212.         jae     EndIni                  ;    1024x768x64k and 1280x1024x256
  213.         mov     bx,offset TwoMegMode1   ; not enough memory, so:
  214.         mov     BYTE PTR [bx+6],0ffh    ;    disable 1280x1024x256
  215.         mov     bx,offset TwoMegMode2
  216.         mov     BYTE PTR [bx+6],0ffh    ;    disable 1024x768x64k
  217. EndIni: mov     ax,1
  218.         ret
  219. driver_init_routine     endp
  220.  
  221.  
  222. ;--------------------------------------------------------------------------
  223. ; MODE SET ROUTINE
  224. ;  sets up a text or graphics mode as close as possible to the one
  225. ;  reguested by the user with regard to number of colors and size.
  226. ;
  227. ;  Entry: AX=mode selection
  228. ;     0 = 80x25 text
  229. ;     1 = default text
  230. ;     2 = text CX cols by DX rows
  231. ;     3 = biggest text
  232. ;     4 = 320x200 graphics
  233. ;     5 = default graphics
  234. ;     6 = graphics CX width by DX height
  235. ;     7 = biggest non-interlaced graphics
  236. ;     8 = biggest graphics
  237. ;     9 = graphics BX colors, CX width by DX height
  238. ;
  239. ;  Exit: BX=driver mode flag
  240. ;        CX=width (in pixels or characters)
  241. ;        DX=height
  242. ;
  243. ;  NOTE: This runs in real mode, but don't mess with the segment registers.
  244. ;        YOU SHOULD NOT NEED TO CHANGE THIS ROUTINE AS IT IS PRETTY
  245. ;        MUCH TABLE DRIVEN
  246. ;--------------------------------------------------------------------------
  247. mode_set_routine        proc    far
  248.     push    ds
  249.     push    di
  250.     push    si
  251.     mov     si,cs
  252.     mov     ds,si
  253.     cmp     ax,9
  254.     jbe     DoIt
  255.     jmp     Exit
  256. DoIt:   add     ax,ax
  257.     mov     si,ax
  258.     jmp     WORD PTR mode_set_table[si]
  259. mode_set_table  label   word
  260.     dw      offset mode_0
  261.     dw      offset mode_1
  262.     dw      offset mode_2
  263.     dw      offset mode_3
  264.     dw      offset mode_4
  265.     dw      offset mode_5
  266.     dw      offset mode_6
  267.     dw      offset mode_7
  268.     dw      offset mode_8
  269.     dw      offset mode_9
  270. mode_0: mov     si,offset text_mode_table       ; 80x25 text
  271.     mov     bx,def_nc
  272.     mov     cx,80
  273.     mov     dx,25
  274.     jmp     Lookup
  275. mode_1: mov     si,offset text_mode_table       ; default text
  276.     mov     bx,def_nc
  277.     mov     cx,def_tw
  278.     mov     dx,def_th
  279.     jmp     Lookup
  280. mode_2: mov     si,offset text_mode_table       ; CX*DX text
  281.     mov     bx,def_nc
  282.     jmp     Lookup
  283. mode_3: mov     si,offset text_mode_table       ; biggest text
  284.     mov     bx,def_nc
  285.     mov     cx,Max_TW
  286.     mov     dx,Max_TH
  287.     jmp     Lookup
  288. mode_4: mov     si,offset graphics_mode_table   ; 320x200 graphics
  289.     mov     bx,def_nc
  290.     mov     cx,320
  291.     mov     dx,200
  292.     jmp     Lookup
  293. mode_5: mov     si,offset graphics_mode_table   ; default graphics
  294.     mov     bx,def_nc
  295.     mov     cx,def_gw
  296.     mov     dx,def_gh
  297.     jmp     Lookup
  298. mode_6: mov     si,offset graphics_mode_table   ; CX*DX graphics
  299.     mov     bx,def_nc
  300.     jmp     Lookup
  301. mode_7: mov     si,offset graphics_mode_table   ; biggest non-interlaced gr
  302.     mov     bx,def_nc
  303.     mov     cx,Max_GWn
  304.     mov     dx,Max_GHn
  305.     jmp     Lookup
  306. mode_8: mov     si,offset graphics_mode_table   ; biggest graphics
  307.     mov     bx,def_nc
  308.     mov     cx,Max_GW
  309.     mov     dx,Max_GH
  310.     jmp     Lookup
  311. mode_9: mov     si,offset graphics_mode_table   ; CX*DX graphics w/ BX colors
  312. ;
  313. ; At this point:
  314. ;   SI points to the table to search (text or graphics)
  315. ;   BX has colors
  316. ;   CX has width
  317. ;   DX has height
  318. ;
  319. Lookup: xor     ax,ax                           ; last color number seen
  320. Find_C: cmp     [si+4],ax                       ; last color number == this?
  321.     je      Same_C
  322.     jb      Prev_C                          ; end of table -- use last color
  323.     cmp     BYTE PTR [si+6],0ffh            ; valid entry ?
  324.     je      Prev_C                          ; not -- use last color
  325.     mov     ax,[si+4]                       ; record color number
  326.     mov     di,si                           ; start of entries w/ this color
  327.     cmp     ax,bx                           ; enough colors ?
  328.     jae     Find_S
  329. Same_C: add     si,8
  330.     jmp     Find_C
  331. Prev_C: or      ax,ax                           ; found any color at all?
  332.     je      Exit
  333. ;
  334. ; At this point:
  335. ;   DI points into the table to the first entry with the desired color
  336. ;      number (either it has enough colors or it is the highest color
  337. ;      number supported by the driver). Additionally, at least the
  338. ;      first (= smallest size) entry for this color is valid (has a
  339. ;      valid BIOS number).
  340. ;   AX has the color number adjusted for the driver
  341. ;   CX has width
  342. ;   DX has height
  343. ;
  344. Find_S: cmp     [di+4],ax                       ; still the same color #?
  345.     jne     Prev_S
  346.     cmp     BYTE PTR [di+6],0ffh            ; valid entry ?
  347.     je      Prev_S
  348.     cmp     [di],cx
  349.     jb      Next_S
  350.     cmp     [di+2],dx
  351.     jae     GotIt
  352. Next_S: add     di,8
  353.     jmp     Find_S
  354. Prev_S: sub     di,8
  355. ;
  356. ; At this point:
  357. ;   DI points to the table entry we want to set up
  358. ;
  359. GotIt:  mov     ax,[di+6]                       ; BIOS mode number
  360.     or      ah,ah                           ; special ?
  361.     je      doBIOS
  362.     mov     al,ah
  363.     xor     ah,ah
  364.     dec     ax
  365.     add     ax,ax
  366.     mov     si,ax
  367.     call    WORD PTR special_setup_table[si]
  368.     jmp     RetVal
  369. doBIOS: int     10h
  370.     mov     bx,GRD_1_PLANE
  371.     cmp     WORD PTR [di+4],2               ; 2 colors ?
  372.     je      doFLAG
  373.     mov     bx,GRD_4_PLANES
  374.     cmp     WORD PTR [di+4],16              ; 16 colors ?
  375.     je      doFLAG
  376.     mov     bx,GRD_8_PLANES
  377.     cmp     WORD PTR [di+4],256             ; 256 colors ?
  378.     je      doFLAG
  379.     mov     bx,GRD_16_PLANES
  380.     cmp     WORD PTR [di+4],32768           ; 32K colors ?
  381.     je      doFLAG
  382.     mov     bx,GRD_16x_PLANES
  383.     cmp     WORD PTR [di+4],0c010h          ; 64K colors ?
  384.     je      doFLAG
  385.     mov    bx,GRD_24_PLANES
  386.     cmp    WORD PTR [di+4],0c018h          ; 16M colors ?
  387.     je     doFLAG
  388.     mov     bx,GRD_PLANE_MASK               ; something is wrong!!
  389. doFLAG: or      bx,mode_W
  390. RetVal: mov     cx,[di]
  391.     mov     dx,[di+2]
  392. Exit:   pop     si
  393.     pop     di
  394.     pop     ds
  395.     ret
  396. mode_set_routine        endp
  397.  
  398.  
  399. ;--------------------------------------------------------------------------
  400. ; PAGING ROUTINE
  401. ;
  402. ;  Entry: AH=read page
  403. ;         AL=write page
  404. ;
  405. ;  Exit: VGA configured.
  406. ;        AX,BX,CX,DX,SI,DI may be trashed
  407. ;
  408. ;  NOTE: This runs in protected mode!  Don't mess with the segment registers!
  409. ;        This code must be relocatable and may not reference any data!
  410. ;--------------------------------------------------------------------------
  411.     assume  ds:nothing, es:nothing
  412.  
  413. paging_routine  proc    far
  414.     mov    cl,4
  415.     shl     ah,cl
  416.     mov     dx,03ceh
  417.     mov     al,9
  418.     out     dx,al
  419.     inc     dx
  420.     mov     al,ah
  421.     out     dx,al
  422.  
  423.     mov     al,8            ; reconfig GR CTRL port for mask writes
  424.     dec     dx
  425.     out     dx,al
  426.     ret
  427. paging_routine  endp
  428.  
  429.  
  430. cseg    ends
  431.     end
  432.